Skip to content

Note

Click here to download the full example code

along-hole transition matrix and MDS

transition_matrix counts which rock type follows which down a hole. for each composite it tallies the class of the composites one lag deeper in the same hole, into a from/to table shaped like domain_change's: rows the shallower rock, columns the deeper one, so bt.plot.domain_change draws it unmodified. bt.plot.transition_mds turns the row frequencies into a dissimilarity and lays the rocks out in 2D by classical MDS, so rocks that often touch sit close together.

import sys
from pathlib import Path

HERE = Path(__file__).parent if "__file__" in globals() else Path.cwd()
sys.path.insert(0, str(HERE.parents[1]))
import boitata as bt
import numpy as np
from common import save

composites and their rock type

5 m composites of the stacked sulphide lenses, majority lithology only (as in domain cleanup); the scheme groups the massive, semi-massive and stringer sulphides into one class.

data = bt.datasets.stacked_sulphide_lenses()
intervals = bt.merge_intervals(data["assays"], data["lithology"])
drillholes = bt.Drillholes(data["collars"], data["surveys"], intervals)
composites = drillholes.composite(5.0, [], categories=["LITH"])
scheme = bt.Categories(
    ["OB", "HWS", "VCL", "SUL", "FWV"],
    mapping={"MS": "SUL", "SMS": "SUL", "STR": "SUL"},
    other="DYK",
    colors=["#d9d9d9", "#a9bfd3", "#8c8c8c", "#c05a28", "#1f4e79", "#e0c080"],
)
depth = (composites["from"] + composites["to"]) / 2
table = bt.transition_matrix(depth, composites["LITH"], composites["HOLE_ID"], lag=5.0, scheme=scheme)
print(f"{len(composites):,} composites, {int(np.sum(table['count'])):,} pairs 5 m apart")

Out:

23,647 composites, 23,069 pairs 5 m apart

the matrix, reused from domain_change

frequency holds each rock's row as shares, so the matrix plot needs no relative=. the diagonal (staying in the same rock) is outlined and left blank.

fig, ax = bt.plot.domain_change(table, value="frequency", fmt="{:.0%}")
ax.set(xlabel="Rock 5 m deeper", ylabel="Rock at a composite")
save(fig, "matrix")

example 07 03

MDS: who sits next to whom

classical MDS turns 1 - (freq + freq.T) / 2 into a 2D layout. the volcaniclastic sits next to the sulphides it overlies, overburden and hanging wall cluster on their own, and the footwall and dyke sit apart, since either rarely borders the others.

fig, ax = bt.plot.transition_mds(table)
save(fig, "mds")

example 07 03

Total running time of the script: ( 0 minutes 0.189 seconds)

Download Python source code: example_07_03.py

Download Jupyter notebook: example_07_03.ipynb

Gallery generated by mkdocs-gallery